This is a draft document to help people build open source software on
IRIX. It may be missing some items but having built literally
hundreds of packages on IRIX over the years we're pretty confident
that most of the pitfalls are covered.
Software that compiles on other UNIX'es (notably those with a smaller API, like Linux and Free/Open/Net BSD), should, almost with no exceptions, compile and run smoothly on IRIX. But read on...
Still there's way too much software out there that makes non-portable
assumptions or is written improperly, which may cause problems.
GNU autoconf generates configure scripts that assume that if a
library exists, it should be used. This is incorrect on IRIX, which
keeps some old libraries around just for the sake of backward
compatibility with very old programs. This alone breaks most of the
GNU utilities on IRIX. To prevent this from happening, simply force
GNU configure to explicitly ignore 'libsocket
',
'libnsl
', 'libgen
' and 'libsun
'.
All these interfaces have their up-to-date entries in the standard C
library libc.so
on IRIX 6.x.
For example, when calling GNU configure you should use something like:
ac_cv_lib_gen_getmntent=no \ ac_cv_lib_sun=no \ ac_cv_lib_sun_getpwnam=no \ ac_cv_lib_sun_getmntent=no \ ac_cv_lib_sun_yp_match=no \ ac_cv_lib_socket=no \ ac_cv_lib_socket_main=no \ configure ...Note that this is just an example. Make sure to look at your
config.cache
(or equivalent) file after configuration,
and inspect it for any suspicious ac_cv_lib...
entries
that match one of the libraries mentioned above and force them to
no
(or equivalent).
Some open source programs assume GNU make in their Makefiles. You
should probably use GNU make on IRIX too. Compatibility is good.
With GNU make supporting parallel makes there's really no reason to
use any IRIX specific make like smake
,
pmake
, or make
.
If you don't have GNU make for IRIX you can download it from http://freeware.sgi.com/ and not worry about Makefile portability anymore.
This is a historical BSD thing that should have been done
transparently by the linker. You don't need to run
ranlib
in IRIX. If your Makefile calls
ranlib
either delete this or define it to a no-op.
gmake RANLIB=: ...
The Berkeley 'install
' is incompatible with the SYSV version.
Either upgrade to IRIX 6.5 (where the IRIX install has transparent
BSD compatibility) or define:
gmake INSTALL=bsdinst ...
BSD programs that assume a BSD environment should compile on IRIX without change (at least in 95% of cases) by forcing BSD compatibility via CFLAGS, e.g:
gmake CFLAGS="-D_BSD_COMPAT ..."
If you don't want full BSD compatibility, consider using one or more of:
-D_BSD_TYPES -D_BSD_TIME -D_BSD_SIGNALSImportant: if your software is more "properly" written and uses POSIX signals (i.e.
sigaction
instead of
signal
) then you must not compile with
-D_BSD_SIGNALS
. Mixing signal models may cause
unpredictable problems.
Some programs assume system types, in particular
'off_t
', are 32 bit (i.e. that files don't exceed 4GB in size)
These programs are making bad assumptions, but this problem can be
overcome by compiling in the o32 (cc -32) ABI:
gmake CC="cc -32 ..."
Some programs do not comply with the ANSI varargs syntax and conventions
(i.e. include <stdarg.h>
and use ellipsis
in the argument list)
Again, if those don't work they may start working by compiling
using the o32 ABI:
gmake CC="cc -32 ..."
The SGI cc is verbose and pedantic. The problem is that when you get way too many warnings you start ignoring the real ones.
To make the SGI compiler more like gcc in terms of warnings you may use something like:
NOWARN = -woff 1009,1014,1110,1116,1185,1188,1204,1230,1233 \ -Wl,-woff,85,-woff,84 $(CC) $(NOWARN) ...In your Makefiles
While the SGI cc may look too pedantic, it can catch a lot of real source code bugs. Consider compiling with:
CC="cc -fullwarn ..."
and really clean your source of type mismatches.
Over the years IRIX got thousands of bug fixes. As expected, problems on IRIX 4.0.x are much more numerous than problems on IRIX 6.5. If you can upgrade, please do. Life is way easier with IRIX 6.5.
Virtually all open source packages assume that the building environment
is the same as the target environment. In fact every Makefile with
a 'make install
' that directly installs into system directories
probably makes this assumption. IRIX supports a much more elegant
model of 'inst'able packages that can be built anywhere and
installed anywhere else.
It would be nice if there was a UNIX-wide standard for this. Red Hat RPM and other Linux installers are getting there, which is great.
We usually build open source software with an IRIX 6.5 ROOT
(i.e. get include files and libraries from a backward compatible
6.5 mounted directory). Assuming this directory is called
/6.5_root
this can be done by:
cc -nostdinc -I. -I/6.5_root/usr/include ... (compiling) cc -nostdlib -L/6.5_root/usr/lib32 ... (linking)
The packaging itself is an art form. At SGI we use a specialized
'install
' perl script to intercept calls from
'make install'
. This install adds the appropriate
lines to the 'idb
' file instead of actually installing
files. Later, this idb file is used by 'gendist
' to
create the packages. Unfortunately, far too many open source
packages call mv
, cp
, tar
,
etc. to install, so they bypass this mechanism. We have considered
but not yet implemented other solutions, such as trapping system
calls or running in a chroot
directory. If you find
(or implement!) a better solution please let us know.
Code that runs fine when compiled with SGI cc and doesn't run when compiled with gcc might be calling one of the following functions:
inet_ntoa, inet_lnaof, inet_netof, inet_makeaddr, semctl
(there may be others). These are functions that get passed
or return structs that are smaller than 16 bytes but not 8 bytes long.
gcc and SGI cc are incompatible in the way they pass
these structs so compiling with gcc and linking with the SGI
libc.so
(which was compiled with the SGI cc)
is likely to cause these problems.
Note that this problem is pretty rare since such functions are
not widely used. This may be considered a bug in gcc but is too
involved to fix I'm told.
Occasionally code that works on other platforms will compile fine on
IRIX, but will misbehave when run. These problems can be difficult
to track down, but one thing to check for is assumptions about
whether char
is signed or unsigned. IRIX compilers
default to unsigned -- if it matters your code should be explicit!
Setting up parallel debugging sessions and stepping through the working and non-working code simultaneously to find where they diverge is often helpful.